---
title: Java 虚拟机是如何加载 Java 类的
---

从 class 文件到内存中的类，按照先后顺序需要经过加载、链接、初始化三大步骤。其中，链接过程需要验证，内存中的类需要初始化才能使用。

Java 语言中的类型可以分为两大类：基本类型（primitive type）和引用类型（reference type）。基本类型是 Java 虚拟机预先定义好的。

至于引用类型，Java 将其细分为类、接口、数组。数组类是由 Java 虚拟机直接生成的，其它两种则需要有对应字节流。

字节流，可以由 Java 编译器生成的 class 文件、在程序内部生成、或者从网络中获取字节流。这些字节流都会被加载到 Java 虚拟机中，成为类和接口。

无论是直接生成的数组类，还是加载的类，Java 虚拟机都需要对其进行链接和初始化。

## 加载
加载，是指查找字节流，并且据此创建类的过程。对于除数组以外的其它类来说 Java 虚拟机需要借助类加载器来完成查找字节流的过程。

启动类加载器（bootstrap class loader）是最顶层的类加载器，由 C++ 实现，没有对应的 Java 对象，在 Java 中用 null 来指代。

除了启动类加载器之外，其它的类加载器都是 java.lang.ClassLoader 的子类，因此有对应的 Java 对象。这些类加载器需要先由另一个类加载器，比如说启动类加载器，加载至 Java 虚拟机中，方能执行类加载。

在 Java 虚拟机中，每当一个类加载器接收到加载请求时，它会先将请求转发给父类加载器。在父类加载器没有找到所请求类的情况下，该类加载器才会尝试去加载。


在 Java 9 以前，启动类加载器负载加载最为基础、最为重要的类，比如存放在 JRE 的 lib 目录下 jar 包中的类（以及由虚拟机参数 -Xbootclasspath 指定的类）。除了启动类加载器之外，另外两个重要的
